package org.easy.file.manager;

import org.easy.file.model.FileModel;
import org.easy.file.monitor.ITask;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;

/**
 * @Description: 任务管理实现类
 * @Author: wxl
 * @CreateTime: 2022/12/27 10:26
 */
public class TaskManager implements ITaskManager{

    private static final ConcurrentMap<String,ITask> TASK_MAP = new ConcurrentHashMap<>(1 << 8);

    /**
     * 添加监控任务
     *
     * @param task 任务
     */
    @Override
    public synchronized void addTask(ITask task) {
        addTask(task.getTaskId(),task);
    }

    /**
     * 添加监控任务
     *
     * @param taskId 任务ID
     * @param task   任务
     */
    @Override
    public synchronized void addTask(String taskId, ITask task) {
        // 不存在的才需要
        if (!TASK_MAP.containsKey(taskId)) {
            TASK_MAP.put(taskId, task);
        }
    }

    /**
     * 获取所有的任务列别
     *
     * @return List<FileTask>
     */
    @Override
    public List<FileModel> getFileTaskList() {
        if (TASK_MAP.isEmpty()) {
            return new ArrayList<>();
        }
        return TASK_MAP.values().stream().map(FileModel::new).collect(Collectors.toList());
    }

    /**
     * 根据ID获取任务
     *
     * @param taskId 任务ID
     * @return ITask
     */
    @Override
    public synchronized ITask getTask(String taskId) {
        if (TASK_MAP.containsKey(taskId)) {
            return TASK_MAP.get(taskId);
        }
        return null;
    }

    /**
     * 删除任务
     *
     * @param taskId 任务ID
     */
    @Override
    public synchronized void delTask(String taskId) {
        TASK_MAP.remove(taskId);
    }

    /**
     * 删除所有任务
     */
    @Override
    public synchronized void delAllTask() {
        if (!TASK_MAP.isEmpty()) {
            TASK_MAP.clear();
        }
    }

    /**
     * 暂停任务
     *
     * @param taskId 任务ID
     */
    @Override
    public synchronized void stopTask(String taskId) {
        ITask iTask = getTask(taskId);
        if (Objects.nonNull(iTask)) {
            iTask.stop();
        }
    }

    /**
     * 暂停所有任务
     */
    @Override
    public synchronized void stopAllTask() {
        if (!TASK_MAP.isEmpty()) {
            TASK_MAP.values().forEach(ITask::stop);
        }
    }

    /**
     * 启动任务
     *
     * @param taskId 任务ID
     */
    @Override
    public void startTask(String taskId) {
        ITask iTask = getTask(taskId);
        if (Objects.nonNull(iTask)) {
            iTask.runTask();
        }
    }

    /**
     * 启动所有任务
     */
    @Override
    public void startAllTask() {
        if (!TASK_MAP.isEmpty()) {
            TASK_MAP.values().forEach(ITask::runTask);
        }
    }
}
